#include "micros.h"
#include "timer.h"  // 使用已有的 timer 库
#include "stm32f10x_tim.h"

// 使用 TIM4（对应 timer_num = 2）
#define MICROS_TIMER_NUM    TIMER_4
#define MICROS_PRESCALER    72      // 72MHz / 72 = 1MHz = 1μs
#define MICROS_AUTO_RELOAD  65535   // 16 位最大值

// 高16位计数器（软件扩展）
static volatile uint32_t g_micros_high = 0;

// 回调函数：TIM4 溢出中断
static void micros_overflow_isr(void) {
    g_micros_high++;
}

// 初始化 micros 系统
void micros_init(void)
{
    // 1. 初始化 TIM4 为基本定时器
    timerBegin(MICROS_TIMER_NUM, MICROS_PRESCALER, 1);  // 向上计数

    // 2. 设置自动重载值（65535）
    timerAlarmWrite(MICROS_TIMER_NUM, MICROS_AUTO_RELOAD, 1);  // auto-reload=on

    // 3. 注册溢出中断回调
    timerAttachInterrupt(MICROS_TIMER_NUM, micros_overflow_isr);

    // 4. 启动定时器
    timerAlarmEnable(MICROS_TIMER_NUM);
}

// 读取当前微秒数
uint32_t micros(void)
{
    uint32_t high;
    uint16_t low;
	uint32_t sr;

    // 关中断，防止在读取时发生溢出
    TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE);
    low = timerRead(MICROS_TIMER_NUM);
    high = g_micros_high;
	sr = TIM4->SR;
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
	// 如果 UIF 置位，说明发生了溢出，中断会处理 g_micros_high++
    // 提前补偿，避免 g_micros_high 滞后
	if ((sr & TIM_FLAG_Update) && low < 65530) {
        high += 1;  // 补偿：预测中断即将执行
    }
    return (high << 16) | low;
}
